import allure

from tools.logger import log_info, log_error
from tools.popup_handler import PopupHandler


def input_code_one(window, code_one: str, name: str, raise_on_error: bool = True):
    """
    输入成品条码
    :param raise_on_error: 出现错误弹窗时决定是否终止流程
    :param name: 条码类型
    :param window: 窗口
    :param code_one: 第一行条码数据
    :return: None
    """
    one_edit = window.child_window(auto_id='textbox0')
    one_edit.wait('visible', timeout=5)
    one_edit.set_focus()
    one_edit.type_keys(code_one, with_spaces=True)
    one_edit.type_keys('{ENTER}')
    log_info(f"✅ {name}输入成功：{code_one}，并发送回车键")

    # 检查输入后是否出现错误弹窗
    popup_shown, message, screenshot = PopupHandler.handle(timeout=2, raise_on_error=raise_on_error)
    if popup_shown and screenshot:
        print(f"🎯 准备附加截图: {screenshot}")
        allure.attach.file(
            screenshot,
            name=f"Popup_{name}_Input",
            attachment_type=allure.attachment_type.PNG)


def input_code_two(window, code_two: str, name: str, raise_on_error: bool = True):
    """
    输入半成品条码
    :param raise_on_error: 出现错误弹窗时决定是否终止流程
    :param name: 条码类型
    :param window: 窗口
    :param code_two: 第二行条码数据
    :return: None
    """
    two_edit = window.child_window(auto_id='textbox1').wait('visible', timeout=5)
    two_edit.set_focus()
    two_edit.type_keys(code_two, with_spaces=True)
    two_edit.type_keys('{ENTER}')
    log_info(f"✅ {name}输入成功：{code_two},并发送回车键")

    popup_shown, message, screenshot = PopupHandler.handle(timeout=2, raise_on_error=raise_on_error)
    if popup_shown and screenshot:
        print(f"🎯 准备附加截图: {screenshot}")  # 临时调试
        allure.attach.file(
            screenshot,
            name=f"Popup_{name}_Input",
            attachment_type=allure.attachment_type.PNG)


def input_data(window, data: str, name: str = 'SemiPACK条码', auto_id: str = 'TextBox1', raise_on_error: bool = True):
    """
    输入条码信息
    :param raise_on_error: 出现错误弹窗时决定是否终止流程
    :param auto_id: 输入框的auto_id属性
    :param name: 输入的数据名称
    :param window: 窗口
    :param data: 输入的数据
    :return:
    """
    code_edit = window.child_window(auto_id=auto_id).wait('visible', timeout=5)
    code_edit.set_focus()
    code_edit.type_keys(data, with_spaces=True)
    log_info(f"✅ {name}输入成功")

    popup_shown, message, screenshot = PopupHandler.handle(timeout=2, raise_on_error=raise_on_error)
    if popup_shown and screenshot:
        print(f"🎯 准备附加截图: {screenshot}")  # 临时调试
        allure.attach.file(
            screenshot,
            name=f"Popup_{name}_Input",
            attachment_type=allure.attachment_type.PNG)


def clear_input_field(window, auto_id: str, field_name: str = "输入框", timeout: int = 5):
    """
    清空指定 auto_id 的输入框内容（全选 + 删除）
    :param window: pywinauto 窗口对象
    :param auto_id: 输入框的 AutomationId
    :param field_name: 字段名称，用于日志和错误提示
    :param timeout: 等待控件出现的超时时间（秒）
    :raises RuntimeError: 当控件不存在时抛出异常
    """
    try:
        # 等待控件可见
        ctrl = window.child_window(auto_id=auto_id)
        ctrl.wait('visible', timeout=timeout)

        # 聚焦并清空
        ctrl.set_focus()
        ctrl.type_keys('^a{BACKSPACE}')  # Ctrl+A 全选 + Backspace 删除

        log_info(f"🧹 已清空 {field_name} (auto_id='{auto_id}')")

    except Exception as e:
        error_msg = f"❌ 清空 {field_name} 失败 (auto_id='{auto_id}'): {e}"
        log_error(error_msg)
        raise RuntimeError(error_msg) from e